package modelo.acao;

import interfaces.UserDAO;

import java.util.ResourceBundle;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import modelo.bean.Usuario;
import modelo.dao.FactoryDatabase;

public class ControladorUsuario {

    FacesContext facesContext = FacesContext.getCurrentInstance();
    Usuario us = new Usuario();
    UserDAO usDAO = FactoryDatabase.createFactory("JPA").createUserDao();
    HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(true);
    ResourceBundle bundle = ResourceBundle.getBundle("language.messages",
            facesContext.getViewRoot().getLocale());

    /**
     * Responsavel por validar o usuario que vem do DAO, e atribu�-lo � sess�o.
     * 
     * @return
     * @throws Exception
     */
    public String logar() {
        String senhaLogin = us.getSenha();

        Usuario temp = usDAO.consultaUsuarioLogin(us);

        if (temp != null) {
            if (temp.getSenha().equals(senhaLogin)) {
                us = temp;
                estadoCivil();
                session.setAttribute("usuario", us);
                return "home";
            } else {
                FacesContext.getCurrentInstance().addMessage(null,
                        new FacesMessage(bundle.getString("msg")));
                return null;
            }
        } else {
            System.out.println("nao existe usuario");
            FacesContext.getCurrentInstance().addMessage(null,
                    new FacesMessage(bundle.getString("msg")));
            return null;
        }
    }

    public String deslogar() {
        session.invalidate();
        System.out.println("Bye");
        return "logout";
    }

    public String cadastrar() {

        if (us.getSenha().equals(us.getSenha2())) {

            if (!verificaExistenciaLoginCadastrado()) {

                if (!verificaExistenciaEmailCadastrado()) {

                    if (!verificaExistenciaCPFCadastrado()) {
                        if (usDAO.insert(us)) {
                            estadoCivil();
                            FacesContext.getCurrentInstance().addMessage(
                                    null,
                                    new FacesMessage(
                                    bundle.getString("usuarioCadastradoComSucesso")));
                            logar();
                            return "logout";
                        } else {
                            FacesContext.getCurrentInstance().addMessage(
                                    null,
                                    new FacesMessage(bundle.getString("usuariNaoCaDastrado")));
                            return null;
                        }
                    } else {
                        FacesContext.getCurrentInstance().addMessage(
                                null,
                                new FacesMessage(bundle.getString("CPFJaCadastrado")));
                        return null;
                    }
                } else {
                    FacesContext.getCurrentInstance().addMessage(
                            null,
                            new FacesMessage(bundle.getString("emailJaCadastrado")));
                    return null;
                }
            } else {
                FacesContext.getCurrentInstance().addMessage(
                        null,
                        new FacesMessage(bundle.getString("loginJaCadastrado")));
                return null;
            }

        } else {
            FacesContext.getCurrentInstance().addMessage(null,
                    new FacesMessage(bundle.getString("senhasNaoConferem")));
            return null;
        }
    }

    public String editar() {
        if (usDAO.update(us)) {
            estadoCivil();
            FacesContext.getCurrentInstance().addMessage(
                    null,
                    new FacesMessage(bundle.getString("dadosAlteradosComSucesso")));
            return "home";
        } else {

            FacesContext.getCurrentInstance().addMessage(
                    null,
                    new FacesMessage(bundle.getString("naoFoiPossivelEditarSeusDados")));
            return null;
        }
    }

    public String excluir() throws Exception {
        Usuario temp = us;
        if (usDAO.delete(temp)) {
            session.invalidate();
            FacesContext.getCurrentInstance().addMessage(null,
                    new FacesMessage("Sua conta foi encerrada."));
            return "logout";
        } else {
            FacesContext.getCurrentInstance().addMessage(
                    null,
                    new FacesMessage(
                    "N�o conseguimos encerrar sua conta, tente mais tarde."));
            return "logout";
        }
    }

    // Metodos de verifica��o, perfeitos para ajax.
    public void estadoCivil() {
        if (us.getEstadoCivil() == 0) {
            us.setEstadoCivilString("Solteiro");
        } else {
            us.setEstadoCivilString("Comprometido");
        }
    }

    public boolean verificaExistenciaEmailCadastrado() {
        // Se retorno for true quer dizer que existe um login deste cadatrado.
        return usDAO.verificaExistenciaEmail(us.getEmail());
    }

    public boolean verificaExistenciaCPFCadastrado() {
        // Se retorno for true quer dizer que existe um CPF deste cadatrado.
        return usDAO.verificaExistenciaCPF(us.getCpf());
    }

    public boolean verificaExistenciaLoginCadastrado() {
        // Se retorno for true quer dizer que existe um login deste cadatrado.
        return usDAO.verificaExistenciaLogin(us.getLogin());
    }

    // Precisa mesmo desses metodos
    public Usuario getUs() {
        return us;
    }

    public void setUs(Usuario us) {
        this.us = us;
    }
}
